﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DBConnect;
using System.Web.Services.Protocols;
using DocumentFormat.OpenXml.Packaging;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace TISS_Add_in
{
    public partial class uc_LotesReapresentacao : UserControl
    {
        public uc_LotesReapresentacao()
        {
            InitializeComponent();
        }

        #region Properties

        private TreeNodeContents nodeContents = new TreeNodeContents();
        public TreeNodeContents NodeContents
        {
            get { return nodeContents; }
            set { nodeContents = value; }
        }

        private TipoGuia tipoLote;

        #endregion

        #region Métodos

        private void carregaTreeViewReapresentacao()
        {
            tipoLote = NodeContents.tipo_guia + 5;
            tvwLotesReapresentacao.Nodes.Clear();
            TreeNode node_tipoLote = new TreeNode((tipoLote).ToString());
            TreeNodeContents tn_tipoLote = new TreeNodeContents(nodeContents.regANS, tipoLote, null);
            node_tipoLote.Tag = tn_tipoLote;
            node_tipoLote.ImageIndex = 0;
            node_tipoLote.SelectedImageIndex = 0;
            DataTable dtLoteGuia = CommandLotes.buscaLoteGuiasTipo(Globals.ThisAddIn.UsuarioID, nodeContents.regANS, (DBConnect.TipoGuia)(tipoLote));
            if (dtLoteGuia.Rows.Count > 0)
            {
                foreach (DataRow drLoteGuias in dtLoteGuia.Rows)
                {
                    if (drLoteGuias.ItemArray[1].ToString() == "")
                    {
                        //Adiciona loteGuia em um TreeNode
                        TreeNode node_loteGuia = new TreeNode(drLoteGuias.ItemArray[0].ToString());

                        TreeNodeContents tn_loteGuia = new TreeNodeContents(nodeContents.regANS, tipoLote, Convert.ToInt64(drLoteGuias["ID"].ToString()), null);
                        node_loteGuia.Tag = tn_loteGuia;
                        node_loteGuia.ImageIndex = 1;
                        node_loteGuia.SelectedImageIndex = 1;
                        //Procura Guias deste loteGuias
                        DataTable dtGuias = DBConnect.CommandGuias.buscaGuiasLote(Convert.ToInt64(drLoteGuias["ID"].ToString()));
                        //Verifica se encontrou alguma guia
                        if (dtGuias.Rows.Count > 0)
                        {
                            //Se encontrou Adiciona ao Lote
                            foreach (DataRow drGuias in dtGuias.Rows)
                            {
                                //Adiciona Guia em um TreeNode
                                TreeNode node_Guia = new TreeNode(Path.GetFileNameWithoutExtension(drGuias["local"].ToString()));
                                TreeNodeContents tn_guia = new TreeNodeContents();
                                tn_guia.tipo_node = node_type.guiaFaturamento;
                                tn_guia.lote_cod = ((TreeNodeContents)node_loteGuia.Tag).lote_cod;
                                node_Guia.Tag = tn_guia;
                                //Guia Cancelada
                                if (Convert.ToBoolean(drGuias["cancelada"].ToString()))
                                {
                                    node_Guia.ImageIndex = 3;
                                    node_Guia.SelectedImageIndex = 3;
                                }
                                else
                                    if (Convert.ToBoolean(drGuias["glosa"].ToString()))
                                    {
                                        node_Guia.ImageIndex = 4;
                                        node_Guia.SelectedImageIndex = 4;
                                    }
                                    else
                                    {
                                        node_Guia.ImageIndex = 2;
                                        node_Guia.SelectedImageIndex = 2;
                                    }
                                //Adiciona TreeNode da guia no TreeNode do LoteGuias
                                node_loteGuia.Nodes.Add(node_Guia);
                            }
                        }
                        //Adiciona o TreeNode do loteGuias no TreeNode do TipoLote
                        node_tipoLote.Nodes.Add(node_loteGuia);
                    }
                }
            }
            //Adiciona TreeNode do Tipo Lote ao TreeView
            tvwLotesReapresentacao.Nodes.Add(node_tipoLote);
        }

        private void CopyGuiasODReapresentacao(string GuiasODsReapresentacaoPath)
        {
            //Copia as Guias de Outras Despesas
            DataTable dtGuiasOD = CommandGuias.buscaOutrasDespesasGuia(NodeContents.numeroGuia, (long)NodeContents.lote_cod);
            foreach (DataRow drGuiaOD in dtGuiasOD.Rows)
            {
                string ODOriginalPath = drGuiaOD.ItemArray[0].ToString();
                string ODReapresentacaoPath = GuiasODsReapresentacaoPath + Path.GetFileNameWithoutExtension(ODOriginalPath) + "Representacao.docx";
                File.Copy(ODOriginalPath, ODReapresentacaoPath, true);
                CommandGuias.insereOutrasDespesas(NodeContents.numeroGuia, ODReapresentacaoPath, (long)((TreeNodeContents)tvwLotesReapresentacao.SelectedNode.Tag).lote_cod);
            }
        }

        #endregion

        #region Eventos

        private void tvwLotesReapresentacao_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            tvwLotesReapresentacao.SelectedNode = e.Node;
        }

        private void tvwLotesReapresentacao_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            switch (((TreeNodeContents)tvwLotesReapresentacao.SelectedNode.Tag).tipo_node)
            {
                case node_type.tipo_lote:
                    tvwLotesReapresentacao.SelectedNode.Expand();
                    break;
                case node_type.lote:
                    tvwLotesReapresentacao.SelectedNode.Expand();
                    break;
                case node_type.guiaFaturamento:
                    tvwLotesReapresentacao.SelectedNode.Expand();
                    break;
            }
        }

        private void btnCriarLote_Click(object sender, EventArgs e)
        {
            string[] dadosLote = DBConnect.CommandLotes.criaLoteGuia((DBConnect.TipoGuia)tipoLote, NodeContents.regANS, Globals.ThisAddIn.UsuarioID);
            if (dadosLote[0] == "0")
                MessageBox.Show(" O intervalo de lotes cadastrados para esta Operadora está esgotado!\nPor favor, cadastre um novo intervalo no menu Configuração.");
            else
            {
                if (dadosLote[0] == "-1")
                    MessageBox.Show("Não existe intervalo de lotes cadastrado para esta operadora!");
                else
                {
                    TreeNode node_loteGuia = new TreeNode(dadosLote[0]);
                    //Pega o ID do lote_Guia
                    TreeNodeContents tn_loteGuia = new TreeNodeContents();
                    tn_loteGuia.lote_cod = Convert.ToInt64(dadosLote[1]);
                    tn_loteGuia.tipo_node = node_type.lote;
                    node_loteGuia.Tag = tn_loteGuia;
                    node_loteGuia.ImageIndex = 2;
                    node_loteGuia.SelectedImageIndex = 2;
                    tvwLotesReapresentacao.Nodes[0].Nodes.Add(node_loteGuia);
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Globals.ThisAddIn.CustomTaskPanes.Remove(Globals.ThisAddIn.LotesReapresentacaoCTP);
        }

        private void uc_LotesReapresentacao_Load(object sender, EventArgs e)
        {
            this.carregaTreeViewReapresentacao();
        }

        private void btnSelecionar_Click(object sender, EventArgs e)
        {
            if (!((((TreeNodeContents)tvwLotesReapresentacao.SelectedNode.Tag).tipo_node == node_type.lote) ||
                (((TreeNodeContents)tvwLotesReapresentacao.SelectedNode.Tag).tipo_node == node_type.guiaFaturamento)))
                MessageBox.Show("Por Favor Selecione um Lote!", "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            else
            {
                sfdGuia.FileName = tvwLotesReapresentacao.Nodes[0].Text + NodeContents.numeroGuia;
                if (sfdGuia.ShowDialog() == DialogResult.OK)
                {
                    string guiaReapresentacaoPath = sfdGuia.FileName;
                    string templatePath;
                    try
                    {
                        AddinUtils.FecharGuia(NodeContents.guia_path);
                    }
                    catch (Exception) {    }
                    //verifica o tipo do Lote
                    switch (tipoLote)
                    {
                        case TipoGuia.Consulta_Reapresentação:
                            templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaConsultaReapresentacao.docx";
                            File.Copy(templatePath, guiaReapresentacaoPath, true);
                            XMLUtils.SubstituiCustomXmlPartReapresentacao("guiaConsulta", "guiaConsultaReapresentacao", guiaReapresentacaoPath, NodeContents.guia_path, tipoLote);
                            break;

                        case TipoGuia.SP_SADT_Reapresentação:
                            if (fbdODPath.ShowDialog() == DialogResult.OK)
                            {
                                templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSP_SADTReapresentacao.docx";
                                File.Copy(templatePath, guiaReapresentacaoPath, true);
                                XMLUtils.SubstituiCustomXmlPartReapresentacao("guiaSP_SADT", "guiaSP_SADTReapresentacao", guiaReapresentacaoPath, NodeContents.guia_path, tipoLote);
                                //Copia as Guias de Outras Despesas
                                this.CopyGuiasODReapresentacao(fbdODPath.SelectedPath);
                            }
                            else
                            {
                                MessageBox.Show("Para Reapresentar a Guia Selecione uma Pasta\npara Copiar as Guias de Outras Despesas", "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                            }
                            break;

                        case TipoGuia.Resumo_Internação_Reapresentação:
                            if (fbdODPath.ShowDialog() == DialogResult.OK)
                            {
                                templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaResumoInternacaoReapresentacao.docx";
                                File.Copy(templatePath, guiaReapresentacaoPath, true);
                                XMLUtils.SubstituiCustomXmlPartReapresentacao("guiaResumoInternacao", "guiaResumoInternacaoReapresentacao", guiaReapresentacaoPath, NodeContents.guia_path, tipoLote);
                                //Copia as Guias de Outras Despesas
                                this.CopyGuiasODReapresentacao(fbdODPath.SelectedPath);
                            }
                            else
                            {
                                MessageBox.Show("Para Reapresentar a Guia Selecione uma Pasta\npara Copiar as Guias de Outras Despesas", "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                            }
                            break;

                        case TipoGuia.Honorário_Individual_Reapresentação:
                            templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaHonorarioIndividualReapresentacao.docx";
                            File.Copy(templatePath, guiaReapresentacaoPath, true);
                            XMLUtils.SubstituiCustomXmlPartReapresentacao("guiaHonorarioIndividual", "guiaHonorarioIndividualReapresentacao", guiaReapresentacaoPath, NodeContents.guia_path, tipoLote);
                            break;

                        case TipoGuia.Odontologia_Reapresentação:
                            templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaOdontologiaReapresentacao.docx";
                            File.Copy(templatePath, guiaReapresentacaoPath, true);
                            XMLUtils.SubstituiCustomXmlPartReapresentacao("guiaOdontologia", "guiaTratamentoOdontologicoReapresentacao", guiaReapresentacaoPath, NodeContents.guia_path, tipoLote);
                            break;
                    }
                    CommandGuias.gravaGuia(guiaReapresentacaoPath, (long)((TreeNodeContents)tvwLotesReapresentacao.SelectedNode.Tag).lote_cod, NodeContents.numeroGuia);                                             
                    CommandGuias.reapresentaGuia(NodeContents.numeroGuia, (long)NodeContents.lote_cod);
                    Globals.ThisAddIn.CustomTaskPanes.Remove(Globals.ThisAddIn.LotesReapresentacaoCTP);
                }
            }
        }

        #endregion

        
    }
}
